تعرف البيرل ثلاثة أنواع للبيانات وهي scalars,arrays,hashes التي تغطى أغلب البيانات لمعالجتها في البرنامج ، بينما البيرل تفهم أكثر من نوع كالـ filehandles و typeglobs والقيمة الغير معرفة والكائنات والمراجع وتعتبر جمعيها من إساسيات لغة البيرل .
المتغيرات مصنف الى ثلاث انواع لتخزين القيم ، من الممكن تخزين الاعداد الصحيحة integer والكسور العشرية float والنصوص string و( وايضاً في بعض الاحيان تعتبر المراجع references والكائنات objects من أنواعها ) .
يعرف المتغير بالاشارة $ يتم وضعها قبل اسم المتغير كما في المثال التالي
#!/usr/bin/perl -w #<---- هذه الجملة لا تنفذ بل هي فقط توضيح للبرنامج فما بعد الرمز "#" في برنامج البيرل هو تعليق $scalar_str = "Hello World\n"; #يمكن ان تتكون سلاسل النصوص من أحراف هجاء ورموز خاصة وأرقام $scalar_int = 42; #أعداد صحيحة موجبة او سالبة $scalar_fp = 1.01; #أعداد ضمنها النقطة العشرية print $scalar_str; print $scalar_int; print "\n"; print $scalar_fp;
في اليمين توضع قيمة المتغيروتخزن هذة القيم او البيانات في هذة المتغيرات ويمكن قراءتها أو تغيرها من خلال هذا الاسم مع تقديم في الامام علامة $ ، ثم طباعة قيم المتغيرات على الشاشة من خلال دالة print وبالتالي سوف يطبع لنا ما خزن داخل المتغير اي قيمة المتغير ، يمكن الإستعاضة عن (' ')التي تستخدم بكثرة في المصفوفات بالإقتباس المزدوج "" الفرق بينهما لايمكن عمل '\n' فهي تظهر كنص
تسمى احياناً بالقوائم Lists فهي تقوم بتعرف اكثر من متغير في مصفوفة واحدة ولتعرف مصفوفة بإستخدام الاشارة @
#!/usr/bin/perl @array = (1, 2, 3, 4, 5, 6); print "The fifth element is $array[4] \n"; #output 5
هنا تعريف المصفوفة المسمى array ومتضمنة المتغيرات 1، 2،3 ،4 ،5 ،6 ثم طباعة والوصول الى خامس عنصر في الفهرس 4 ( يبداء الفهرس بالصفر ).
يوجد طريقة اخرى لتعريف مصفوفة واستخلاص عناصرها بوضع الفهرس في اخر القائمة كما في التالي
print "The fifth element is ", (1, 2, 3, 4, 5, 6)[4];
واذا قمت بتحديد الفهرس بالسالب ، فان مفسر البيرل سوف يقدر الفهرس من الاخير بشكلاً معاكس
print "The last element is $array[-1] \n"; # 6
يستخرج في السابق الفهرس 5 التي هي القيمة 6
ويمكننا الوصول الى مجموعة من القيم وذلك بتحديد مدى للفهرس بواسطة المؤثر .. ، وهذا ما يعرف بأخذ جزء slice من المصفوفة
print "The third to fifth elements: @array[2..4] \n"; # 3 5 print "The first two and last two elements: @array[0, 1, -2, -1] \n"; # 1 2 5 6في الجملة السابقة استخراج العناصر التي في مدى الفهرس 2 إلى الفهرس 4 .السطر التالي إستخراج العناصر في الفهرس 0 و1 و 4 و 5 .
تستخدم الدالة join لطباعة جميع عناصر المصفوفة
#!/usr/bin/perl -w
@Hello = ('Hello', 'World');
print join(' ', @Hello) . "\n"; # الطباعة بادالة join
مثال نفس السابق لكن بواسطة الدالة Split
#!/usr/bin/perl -w
$Sentence = "how are you ?";
@Words = split(/ /, $Sentence) ;
print "@Words" . " " . "That was splitting data" . "\n";
@Hello = ('Hello', 'World');
print $Hello[0] . " " . $Hello[1] . "\n";
Split نظيرة للدالة join ،تستخدم join لتحويل القائمة الى نصوص وتعيد الناتج كسلاسل نصوص ويفصل بين عناصر المصفوفة بواسطة الوسيط الاول الذي ليس تعبيراً منتظم بينما split تمثل بالتعبيرات المنتظمة حيث تقوم بتجزءه او تقسم النصوص الى قطع صغيرة وتستخدم الدالة لتحويل النصوص الى قوائم (او هاشات) ولها ثلاثة وسطاء فاول وسيط نمط المطابقة في هذة الحالة عند كل فراغ ،ثاني وسيط النصوص التي سوف يتم تقسيمها، اما الوسيط الثالث فهو خياري لتحديد العدد الاقصي للنصوص التي سوف يتم تقسيمها
بنفس العمل من خلال المعامل qw
#!/usr/bin/perl -w
@array = qw(bam bam bam bam);
print join(' ', @array);
الدالة push()
لدفع او إظافة عنصر الى اخر المصفوفة
#!/usr/bin/perl -w
@food = ("cheese", "meet", "milk", "bread");
push(@food, "eggs");
print join(',', @food) . "\n"."the length:".$#food;
يستعمل المتغير الخاص $# لاعادة الفهرس الاخير من المصفوفة حيث تبداء من الصفر .
يمكن دفع عنصرين او اكثر الى المصفوفة عن طريق احد الصيغ التالية :
push(@food, "eggs", "lard"); #دفع عنصرين
push(@food, ("eggs", "lard")); # نفس السابق
push(@food, @morefood); # دفع مصفوفة
يدفع الاخير عناصر المصفوفة morefood الى نهاية المصفوفة food .
الدالة pop()
لسحب او إزالة عنصر من اخر المصفوفة
$grub = pop(@food); # الان $grub = "bread" وتزال من المصفوفة
الدالة unshift()
تعمل تماماً كدالة push لكن العنصر يضاف في بداية المصفوفة بدلاُ من نهاية المصفوفة
unshift(@food,'element');# adds element to beginning of array.
الدالة shift()
تعمل كدالة pop لكن العنصر يزال من اول المصفوفة
$scalar = shift (@food); # $scalar becomes 'element'
الدالة splice()
الدالة splice تسمح باستبدال جزء من المصفوفات بالقوائم المحددة ، فإذا رغبنا في تغير بعض العناصر واستبدالها بواسطة وسطاء الدالة splice وتأخذ هذة الدالة في وسطاها (المصفوفة وبداية الفهرس وعدد العناصر والقائمة البديلة)
splice @array, $from, $quantity, @replacement;
على سبيل المثال لإستبدال ثلاثة عناصر في مصفوفة لديها ستة عناصر مع ثلاثة عناصر جديدة (سوف تنشاء قائمة مع ثمانية عناصر )
#!/usr/bin/perl
# splice1.pl
use strict;
use warnings;
my @array = ('a', 'b', 'c', 'd', 'e', 'f');
# replace third element with three new elements
my $removed = splice (@array, 2, 1, (1, 2, 3));
print "@array \n"; # produces 'a b 1 2 3 d e f'
print "$removed \n"; # produces 'c'
في المثال السابق استبدال من العنصر الثالث ( الفهرس 2 ) مع حذف عنصر واحد ثم استبداله بالقائمة المكونة من ثلاثة عناصر ، والقيمة المحذوفة تعاد الى المتغير $removed ، واذا اردنا حذف اكثر من عنصر يجب تخصص الى مصفوفة @removed كما في التالي
#!/usr/bin/perl
# splice2.pl
use strict;
use warnings;
my @array = ('a', 'b', 'c', 'd', 'e', 'f');
# replace three elements 2, 3, and 4 with a different three
my @removed = splice @array, 2, 3, (1, 2, 3);
print "@array\n"; # produces 'a b 1 2 3 f'
print "@removed\n"; # produces 'c d e'
لحذف العناصر بدون اضافة شئ ، فقط نحذف قائمة الاستبدال
#!/usr/bin/perl
# splice3.pl
use strict;
use warnings;
my @array = ('a', 'b', 'c', 'd', 'e', 'f');
# remove elements 2, 3 and 4
my @removed = splice @array, 2, 3;
print "@array\n"; # produces 'a b f'
print "@removed\n"; # produces 'c d e'
هنا حذف ثلاثة عناصر من بداية الفهرس المحدد ، ويمكن تحديد بداية الفهرس بشكل عكسي بواسطة وضع فهرس سالب
#!/usr/bin/perl
# splice4.pl
use strict;
use warnings;
my @array = ('a', 'b', 'c', 'd', 'e', 'f');
# remove last three elements
my @last_3_elements = splice @array, -3;
print "@array\n"; # produces 'a b c'
print "@last_3_elements\n"; # produces 'd e f'
الدالة splice متعددة الاستعمال ولهااشكال ووظائف مختلفة وبالطبع الاسهل استعمال الدوال السابقة pop و push .
سؤال سيراودك :ما الفارق بين التعبيرين التاليين:
$count = @food; # $count = scalar(@food); اوضح $string = "@food";
فاول تخصيص يقوم بتقدير عدد العناصرفي المصفوفة ، ففي بعض الحالات التي قد يسبب مفسر البيرل بخطاً بسبب ان التخصيص من مصفوفة الى متغيرلذلك يجب استعمال الدالة scalar لتقدير المصفوفة في سياق scalar context . لاحظ يستخدم السياق لمعرفة عدد العناصر وهي تساوي
$highest = $#food; #مساوي $highest = scalar(@food)-1
التخصيص الثاني في المثال السابق يجعل المصفوفه كالنصوص مع عمل الفراغات بين العناصر (هكذا يمكن استبدال الفراغ بواسطة اي نص اخر عن طريق تغير القيمه مع المتغير الخاص $" سوف يشرح أسفل، هذا المتغير واحد من العديد من المتغيرات الخاصة في البيرل وهو مفيد للتعامل مع الملفات ).
و ايضاً يمكن أن تستعمل = في تخصيصات اخرى لاحظ التالي
($a, $b) = ($c, $d); # وهي نفس تخصيص $a=$c; $b=$d; ($a, $b) = @food; ($a, @somefood) = @food; (@somefood, $a) = @food;
ثاني تخصيص المتغير a يأخذ أول عنصر من المصفوفة food والمتغير b لثاني عنصر . وثالث تخصيص المتغير a له أول عنصر من المصفوفة food والمصفوفة somefood بقية العناصر . ورابع تخصيص فأن المصفوفة somefood تخصص بعناصر المصفوفة food والمتغير a غير معرف
تكلمنا عن المتغيرات الخاصة المتوفرة لدى البيرل التي تودي العديد من الاغراض المختلفة ومن ضمن هذة المتغيرات $\و $, و $" للسيطرة على الخرج
#!/usr/bin/perl @array = (1, 2, 3, 4); $\ = "\n"; print @array; # display '1234' print "@array"; # display '1 2 3 4' $, =', '; print @array; # display '1, 2, 3, 4' print "@array"; # still display '1 2 3 4' $"=':'; print "@array"; # display '1:2:3:4'
$\ الخرج يسجل المفصول ويجد ماستضع لكي يوضع على النهاية الخرج بعد اخر قيمة ويستعمل $, الحرف المتضمن لتغير خرج الحقل بالفاصلة ويوضع على جميع القيم (فقط في المصفوفات ) ، ويقدر في السياق بإستخدام $"
هناك في الملحق b بعض المتغيرات الخاصة وللاطلاع أكثر يوجد العديد من وثائق البيرل التي تتحدث عن المتغيرات الخاصة لكن مع ذلك ليس علينا حفظ جميعها الا فقط ما نستخدم بكثرةالهاش او المصفوفة المترابطة نوع اخر من انواع البيانات وهو شبية بالمصفوفة العادية ، فالمصفوفة العادية تسمح لنا بالوصول الى عنصرها بواسطة الفهرس ولكن بالعداد $food[0] و $food[1] ..الخ ، بينما تمنح البيرل إنشاء مصفوفة التي يمكن الوصول اليها بواسطة الفهرس بالنصوص وتسمي بالمصفوفات المترابطة ، ولتعريف مصفوفة مترابطة نستعمل علامات الحصر ووضع الاشارة % ، على سبيل المثال ترغب في انشاء مصفوفة اسماء لاشخاص واعمارهم
#!/usr/bin/perl
%ages = ("Michael Caine", 39,
"Dirty Den", 34,
"Angie", 27,
"Willy", "21 in dog years",
"The Queen Mother", 108 );
# تغير القيمة
$ages{"Michael Caine"}=50; # $HASH{$KEY} = $VALUE;
# ليجاد اعمارهم
print $ages{"Michael Caine"}; # Returns 50
print $ages{"Dirty Den"}; # Returns 34
print $ages{"Angie"}; # Returns 27
print $ages{"Willy"}; # Returns "21 in dog years"
print $ages{"The Queen Mother"}; # Returns 108
القيمة المخزنة في الهاش تسمى بالمدخلات entries ولكي نصل الى تلك القيمة نستخدم {...} constructor مضمن الفهرس المراد الوصول اليه
توفر البيرل بإستخدام الموثر => مساوي تماماً للموثر ,
%ages = ("Michael Caine"=> 39,
"Dirty Den"=> 34,
"Angie"=> 27,
"Willy"=> "21 in dog years",
"The Queen Mother"=> 108
);
ملاحظة بقية طرق الوصول الى الهاش لاتهم الفهم في الوقت الحالي يمكنك تخطي والعودة اليها بعد فهم المراجع والتي سنأتي على ذكرها لاحقاَ ولكن يفضل التطبيق مع ذلك
print join(' ',@ages{"Michael Caine","Dirty Den","Angie"});
ويمكنك تغير الهاش
@ages{"Michael Caine","Dirty Den"}=(5,6); # تغير الهاش الاصل
@info{"Michael Caine","Dirty Den"}=(5,6); # نسخ ولاتستدعى الهاش
print join(' ',@info{"Michael Caine","Dirty Den"}),"\n";
فالتعبير الثاني كما لو انك انشاءات هاش جديد بالاسم info %info = ( "Michael Caine"=>5,"Dirty Den"=>6 ); وبامكان تحول المصفوفة المترابطة الى مصفوفة عادية بتخصيص المصفوفة المترابطة الى مصفوفة ، وكذلك المصفوفة يمكن تحوليها الى مصفوفة مترابطة بتخصيص المصفوفة الى مصفوفة مترابطة .
@info = %ages;
print $info[5]."\n";
print join(' ', @info) . "\n";
%moreages = @info;
بتخصيص %ages الى @info ، تصبح المصفوفه @info بعشره عناصر ، وعند تخصيص @info الى %moreages ، تصبح المصفوفة المترابطة %moreages نفس %ages. ملاحظة الهاش له استخدامات كثيره ويختلف المسميات مع لغات البرمجة كال tables , hash tables , dictionaries, mappings حيث يستخدم لربط المصفوفات التي تنمو حسب الضرورة لمنع تخفيض الاداء ، ونستطيع تخزين عده قيم في فهرس واحد بواسطة تخزين مصفوفة المراجع في $hash{$key} ، ثم وضع القيم الى مصفوفة المراجع
#!/usr/bin/perl
%ages = ( ); # هاش فارغة
push( @{$ages{"Michael Caine"}}, 39,"address","street");
@a=@{$ages{"Michael Caine"}};
foreach $i(@a)
{
print $i." ";
}
#print @{$ages{"Michael Caine"}};
|